#!/bin/sh

if [ -z $1 ]
then
    echo "if first parameter is ap or sta, as follows: "
    echo $"    Usage: $0 <sta|ap> ip netmask route" >&2
    echo "if first parameter is wired, as follows: "
    echo $"    Usage: $0 wired ip netmask route ap_ip" >&2
    exit 1
fi

if [ ! -d "/var/lib/misc" ];then
    mkdir -p /var/lib/misc
fi

if [ ! -f "/var/lib/misc/udhcpd.leases" ];then
    touch /var/lib/misc/udhcpd.leases
fi

MODE=$(echo $1 | awk '{print toupper($0)}')
echo "mode: ${MODE}"
if [ $MODE == "STA" ]
then
    echo "Enable network interface $WLAN work on $MODE mode." >&2

    if [ -z $2 ] || [ -z $3 ] || [ -z $4 ]
    then
        WDEV_IP="192.168.2.51"
        WDEV_NETMASK="255.255.25.0"
        WDEV_ROUTE="192.168.2.100"
    else
        WDEV_IP=$2
        WDEV_NETMASK=$3
        WDEV_ROUTE=$4
    fi

    echo "WLAN IP: ${IDEV_IP}"
    echo "WLAN MASK: ${IDEV_NETMASK}"
    echo "WLAN ROUTE: ${IDEV_ROUTE}"
    echo "WLAN SECTION: ${INET}"

    if [ -z "${WDEV_NETMASK}" ] ; then
        eval $(/bin/ipcalc --IDEV_NETMASK ${WDEV_IP})
    fi

    RET=`/sbin/ifconfig | grep 'wlan0' | awk '{print $1}'`
    if [ -z ${RET} ]
    then
        WLAN="wlan0"
        ifconfig ${WLAN} ${WDEV_IP} netmask ${WDEV_NETMASK} up
        sleep 3s
        ifconfig ${WLAN} up
    else
        WLAN="wlan0"
        ifconfig ${WLAN} ${WDEV_IP} netmask ${WDEV_NETMASK} up
        sleep 1s
        ifconfig ${WLAN} up
        echo "WIFI ready."
    fi

    echo "WLAN: ${WLAN}"

    INET=`echo ${WDEV_IP}|cut -d '.' -f 1-3`.0
    ip route replace default via ${WDEV_ROUTE}

    if [ ! -e /var/run/wpa_supplicant ]
    then
        mkdir -p /var/run/wpa_supplicant
    fi

    wpa_supplicant -B -Dwext -i${WLAN} -c /etc/wpa-psk-tkip.conf


elif [ $MODE == "AP" ]
then
    echo "Enable network interface wlan0 work on $MODE mode." >&2

    if [ -z $2 ] || [ -z $3 ] || [ -z $4 ]
    then
        IDEV_IP="192.168.0.1"
        IDEV_NETMASK="255.255.25.0"
        IDEV_ROUTE="10.64.64.64"
    else
        IDEV_IP=$2
        IDEV_NETMASK=$3
        IDEV_ROUTE=$4
    fi

    echo "LAN IP: ${IDEV_IP}"
    echo "LAN MASK: ${IDEV_NETMASK}"
    echo "LAN ROUTE: ${IDEV_ROUTE}"

    ##Waiting for starting 4G module##
    count=0
    while [ ! -c /dev/ttyUSB2 ]
    do
        if [ $count -gt 10 ]
        then
            break 
        fi
        echo "wait $count times to 3G/4G module up..."
        count=`expr $count + 1`
        sleep 1s
    done

    RET=`/sbin/ifconfig | grep 'ppp0'|awk '{print $1}'`
    if [ -z ${RET} ]
    then
        ODEV="ppp0"
        pppd call unicom
    else
        ODEV=${RET}
    fi

    count=0
    while [ "$count" -lt 10 ]
    do
        var=`ifconfig|grep 'ppp0'`
        if [ -n "$var" ]
        then
            break;
        fi                                    
        echo "wait $count times to ppp0 up..."
        sleep 1s               
        count=`expr $count + 1`
    done

    RET=`/sbin/ifconfig | grep 'wlan0' | awk '{print $1}'`
    if [ -z ${RET} ]
    then
        IDEV="wlan0"
        ifconfig ${IDEV} ${IDEV_IP} netmask ${IDEV_NETMASK} up
    else
        IDEV=${RET}
        ifconfig ${IDEV} ${IDEV_IP} netmask ${IDEV_NETMASK} up
    fi

    count=0
    while [ "$count" -lt 10 ]
    do
        var=`ifconfig|grep 'wlan0'`
        if [ -n "$var" ]
        then
            break;
        fi                                    
        echo "wait $count times to wlan0 up..."
        sleep 1s               
        count=`expr $count + 1`
    done

    ODEV_ROUTE=`route|grep 'ppp0'|grep -v 'default'|awk '{print $1}'`                             
    echo "New route is ${ODEV_ROUTE}"                                           
    ip route replace default via ${ODEV_ROUTE} 

    iptables -F
    iptables -X
    iptables -Z

    ###Iptables TC QoS Configuration Start###

    #Uplink total bandwidth
    UP="64kbps"
    #Downlink total bandwidth
    DOWN="256kbps"

    #Speed limit range IP uplink guaranteed bandwidth
    UPLOADrate="10kbps"
    #Speed limit range IP uplink maximum bandwidth
    UPLOADceil="32kbps"
    #Speed limit range IP downlink guaranteed bandwidth
    DOWNLOADrate="30kbps"
    #Speed limit range IP downlink maximum bandwidth
    DOWNLOADceil="128kbps"

    #Speed segment
    INET="192.168.1."

    #Speed limit range start IP
    IPS="100"
    #Speed limit range over IP
    IPE="110"

    #IP share (total) downstream speed not in the speed limit
    outdown="16kbps"
    #Share (total) uplink speed not in the speed limit range IP
    outup="10kbps"

    #Clear queue rule (initialization)
    /usr/sbin/tc qdisc del dev {$ODEV} root 2>/dev/null
    /usr/sbin/tc qdisc del dev ${IDEV} root 2>/dev/null

    #Set root queue
    /usr/sbin/tc qdisc add dev ${ODEV} root handle 10: htb default 2254
    /usr/sbin/tc qdisc add dev ${IDEV} root handle 10: htb default 2254

    #Set the total speed
    /usr/sbin/tc class add dev ${ODEV} parent 10: classid 10:1 htb rate ${UP} ceil ${UP}
    /usr/sbin/tc class add dev ${IDEV} parent 10: classid 10:1 htb rate ${DOWN} ceil ${DOWN}

    #Start setting the speed limit range IP rule
    i=${IPS};
    while [ $i -le $IPE ]
    do
        /usr/sbin/tc class add dev ${ODEV} parent 10:1 classid 10:2${i} htb rate ${UPLOADrate} ceil ${UPLOADceil} prio 1
        /usr/sbin/tc qdisc add dev ${ODEV} parent 10:2${i} handle 100${i}: pfifo
        /usr/sbin/tc filter add dev ${ODEV} parent 10: protocol ip prio 100 handle 2${i} fw classid 10:2${i}
        /usr/sbin/tc class add dev ${IDEV} parent 10:1 classid 10:2${i} htb rate ${DOWNLOADrate} ceil ${DOWNLOADceil} prio 1
        /usr/sbin/tc qdisc add dev ${IDEV} parent 10:2${i} handle 100${i}: pfifo
        /usr/sbin/tc filter add dev ${IDEV} parent 10: protocol ip prio 100 handle 2${i} fw classid 10:2${i}
        /usr/sbin/iptables -t mangle -A PREROUTING -s ${INET}${i} -j MARK --set-mark 2${i}
        /usr/sbin/iptables -t mangle -A POSTROUTING -d ${INET}${i} -j MARK --set-mark 2${i}
        i=`expr $i + 1`
    done

    #Not in the speed limit range IP rules
    /usr/sbin/tc class add dev ${ODEV} parent 10:1 classid 10:2254 htb rate ${outup} ceil ${outup} prio 1
    /usr/sbin/tc qdisc add dev ${ODEV} parent 10:2254 handle 100254: pfifo
    /usr/sbin/tc filter add dev ${ODEV} parent 10: protocol ip prio 100 handle 2254 fw classid 10:2254

    /usr/sbin/tc class add dev ${IDEV} parent 10:1 classid 10:2254 htb rate ${outdown} ceil ${outdown} prio 1
    /usr/sbin/tc qdisc add dev ${IDEV} parent 10:2254 handle 100254: pfifo
    /usr/sbin/tc filter add dev ${IDEV} parent 10: protocol ip prio 100 handle 2254 fw classid 10:2254

    /usr/sbin/iptables -t nat -A POSTROUTING -o ${ODEV} -j MASQUERADE
    /usr/sbin/iptables -A FORWARD -i ${ODEV} -o ${IDEV} -m state --state RELATED,ESTABLISH -j ACCEPT
    /usr/sbin/iptables -A FORWARD -i ${IDEV} -o ppp0 -j ACCEPT

    echo "1" > /proc/sys/net/ipv4/ip_forward

    if test $(pgrep -f "hostapd" | wc -l) -eq 0
    then
        echo "hostapd ......"
        /usr/sbin/hostapd /etc/hostapd.conf -B
    fi

    if test $(pgrep -f "udhcpd" | wc -l) -eq 0
    then
        echo "udhcpd ......"
        /usr/sbin/udhcpd -f /etc/udhcpc/udhcpd.conf &
    fi

elif [ "$MODE" = "WIRED" ]
then
    if [ -z $2 ] || [ -z $3 ] || [ -z $4 ]
    then
        IDEV_IP="192.168.10.1"
        IDEV_NETMASK="255.255.255.0"
        IDEV_ROUTE="192.168.10.1"
    else
        IDEV_IP=$2
        IDEV_NETMASK=$3
        IDEV_ROUTE=$4
    fi
    INET=`echo ${IDEV_IP}|cut -d '.' -f 1-3`.0

    echo "LAN IP: ${IDEV_IP}"
    echo "LAN MASK: ${IDEV_NETMASK}"
    echo "LAN ROUTE: ${IDEV_ROUTE}"
    echo "LAN SECTION: ${INET}"

    ##Waiting for starting 4G module##
    count=0
    while [ ! -c /dev/ttyUSB2 ]
    do
        if [ $count -gt 10 ]
        then
            break 
        fi
        echo $count
        count=`expr $count + 1`
        sleep 1s
    done

    RET=`ifconfig | grep 'ppp0' | awk '{print $1}'`
    if [ -z ${RET} ]
    then
        pppd call unicom
    fi

    count=0
    while [ "$count" -lt 10 ]
    do
        var=`ifconfig|grep 'ppp0'`
        if [ -n "$var" ]
        then
            echo "break..."
            break;
        fi                                    
        echo "wait $count times to ppp0 up..."
        sleep 1s               
        count=`expr $count + 1`
    done

    RET=`ifconfig -a | grep 'eth0' | awk '{print $1}'`
    if [ "${RET}" = "eth0" ]
    then
        RET=`ifconfig | grep 'eth0' | awk '{print $1}'`
        if [ "${RET}" = "eth0" ]
        then
            echo "${RET} start up already."
        else
            ifconfig eth0 ${IDEV_IP} netmask ${IDEV_NETMASK} up
            sleep 3s
            ifconfig eth0 up
        fi
    fi


    if [ -z $5 ]
    then
        AP_IP="192.168.10.2"
    else
        AP_IP=$5
    fi

    echo "AP ipaddr: ${AP_IP}"


    iptables -X
    iptables -F
    iptables -t nat -X
    iptables -t nat -F

    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

    ip route del default

    echo "NAT INET: ${INET}"
    echo "NAT ROUTE: ${IDEV_ROUTE}"
    ip route replace ${INET} via ${IDEV_ROUTE}

    ODEV_ROUTE=`route|grep 'ppp0'|grep -v default|awk '{print $1}'`
    echo "PPP0 ROUTE: ${ODEV_ROUTE}"
    ip route replace default via ${ODEV_ROUTE}

    ## detect the AP network connection##
    counter=0
    while [ $counter -lt 10 ]
    do
        PING=`ping ${AP_IP} -c 1 -w 1`
        case "${PING}" in
            *ttl* )
                echo "AP ROUTE ${AP_IP} is ok"
                break
                ;;
            * )
                echo "AP ROUTE ${AP_IP} is down"
                ;;
        esac
        counter=`expr $counter + 1`
    done

    ##telnet AP to set default route##
    (sleep 1;echo admin;sleep 1;echo admin; \
        echo ip route replace default via ${IDEV_ROUTE};sleep 1)| \
        telnet ${AP_IP}

    echo "1" > /proc/sys/net/ipv4/ip_forward

else
    echo "The input parameter errors, there is no this model."
fi
